package main

import (
	"context"
	"fmt"
	"time"
)

func main() {
	parentCtx := context.Background()                            //创建 父上下文（默认值），作为所有子上下文的基础
	ctx, cancel := context.WithTimeout(parentCtx, 5*time.Second) //基于父上下文，创建一个子上下文，在 5 秒后，会自动取消
	defer cancel()                                               //程序结束时，如果该上下文还没有取消，就手动取消 子上下文(ctx)
	go doSomething1(ctx)                                         //创建一个子goroutine
	time.Sleep(10 * time.Second)                                 //主goroutine会睡眠 10 秒，以便能够看到输出信息
	/*结果：
	正在执行任务
	任务完成了
	*/
}

func doSomething1(ctx context.Context) {
	select {
	case <-ctx.Done(): //监控上下文的状态
		fmt.Println("任务被取消")
		return
	default:
		fmt.Println("正在执行任务")
		time.Sleep(8 * time.Second) //模拟执行任务所需的时间
		fmt.Println("任务完成了")
	}
}
